/*
 * DeferredResourceStrategy.cpp
 *
 *  Created on: 03/10/2009
 *      Author: nik0l4z
 */

#include "../../../Strategies/Resource/DeferredResourceStrategy.h"


DeferredResourceStrategy::DeferredResourceStrategy() {

}

DeferredResourceStrategy::DeferredResourceStrategy(Almacenamiento *buffer,Almacenamiento *disco){

	this->buffer = buffer;
	this->disco = disco;
	this->setCompressor(new ContenedorComprimido());

}

DeferredResourceStrategy::~DeferredResourceStrategy() {

	delete this->buffer;
	delete this->disco;
	delete this->getCompressor();

}

void DeferredResourceStrategy::saludar(){
	cout << "soy una DeferredResourceStrategy" << endl;
}


int DeferredResourceStrategy::Save(string& dato, int posicionArchivo)
{
	if(this->getCompressMode()==true){
			dato = this->getCompressor()->compress(dato);
		}

	this->buffer->deleteData(posicionArchivo); // Elimina si existe una posicion del buffer con igual offset

	this->buffer->Limpiar(); // Limpia los datos que hallan estado durante cierto tiempo en el buffer y se encuentren persistidos

	this->buffer->saveData(dato,posicionArchivo); // Se graba el dato recibido por parametro en la primera posicion de la lista, para que en caso de que sea reutilizado, se lea con rapidez


	return 0;

}

void DeferredResourceStrategy::Update(string& dato, int posicionArchivo)
{
	if(this->getCompressMode()==true){
			dato = this->getCompressor()->compress(dato);
		}

	this->buffer->updateData(posicionArchivo,dato); // Se actualiza buffer. Se marca como NO PERSISTIDO.

}

void  DeferredResourceStrategy::Delete(int posicionArchivo)
{

	this->buffer->deleteData(posicionArchivo);

	this->disco->deleteData(posicionArchivo);


}


string DeferredResourceStrategy::GetData(int posicionArchivo)
{

	string cadena;

	cadena=this->buffer->getData(posicionArchivo); // Si el dato se encuentra en el buffer, lo trae

	if (cadena=="")
	{

		cadena=this->disco->getData(posicionArchivo); // De lo contrario lo busca en disco

		this->buffer->saveData(cadena, posicionArchivo); // Guarda en buffer el dato leido de disco, para optimizar futuras busquedas

	}

	if(this->getCompressMode()==true){
			cadena = this->getCompressor()->uncompress(cadena);
		}


	return cadena;
}


void DeferredResourceStrategy::persistOldData(){

	int offset = this->buffer->getOldData();

	if (offset == -1){

		return;

	}

	string conjuntoDeDatosSerializados = this->buffer->getData(offset);

	if(this->getCompressMode()==true){
		conjuntoDeDatosSerializados = this->getCompressor()->compress(conjuntoDeDatosSerializados);
	}

	this->disco->saveData(conjuntoDeDatosSerializados, offset);

	this->buffer->deleteData(offset);

	return;

}

Almacenamiento * DeferredResourceStrategy::getStorage() const {

	return buffer;
 }

